---
title: HttpClient详解
description: Feat HttpClient 是一个功能强大的HTTP客户端库，支持多种请求方法和高级配置
sidebar:
    order: 1
---
import CheckAuthorize from '../../../components/CheckAuthorize.astro'

<CheckAuthorize/>

Feat HttpClient 是一个功能强大、灵活且高效的 HTTP 客户端库，旨在帮助开发者轻松发送 HTTP 请求、处理响应，并支持多种高级功能。它支持常见的 HTTP 方法（如 GET、POST、PUT、DELETE 等），并提供了灵活的配置选项，以满足不同场景下的需求。

Feat HttpClient 的设计理念注重性能、易用性和扩展性，能够与 Feat 框架的其他组件无缝集成，为开发者提供一致的开发体验。

## 快速上手

### 引入依赖

在 Maven 项目中，添加以下依赖到 `pom.xml`：

```xml
<dependency>
    <groupId>tech.smartboot.feat</groupId>
    <artifactId>feat-core</artifactId>
    <version>${feat.version}</version>
</dependency>
```

### 发送第一个 GET 请求

以下是一个简单的示例，展示了如何使用 Feat HttpClient 发送 GET 请求并处理响应：

```java
import tech.smartboot.feat.core.client.HttpClient;
import java.io.IOException;

public class HttpClientDemo {
    public static void main(String[] args) throws IOException {
        // 创建 HttpClient 实例
        HttpClient client = new HttpClient("https://www.baidu.com");

        // 发送 GET 请求
        client.get().onSuccess(response -> {
            // 处理响应
            System.out.println("Status Code: " + response.statusCode());
            System.out.println("Body: " + response.body());
        }).submit();
    }
}
```

---

## HttpClient 实例化
HttpClient 提供了 2 种实例化方式：

**方式一：完整的请求URL**
```java
HttpClient client = new HttpClient("http://127.0.0.1:8080");

HttpClient client = new HttpClient("https://smartboot.tech/feat/");
```
该种方式会自动解析 URL 中的 host 和 port 信息，并识别是否使用 HTTPS 协议。

**方式二：指定 host、port**
```java
HttpClient httpClient = new HttpClient("127.0.0.1", 8080);

HttpClient httpClient = new HttpClient("smartboot.tech", 443);
```


## Options 配置
通过 HttpClient.options() 方法提供了客户端的配置选项，支持链式调用。
### host
**类型:** `String`

**默认值:** `null`

服务地址，必填

### port
**类型:** `int`

**默认值:** `80`

服务端口


### connectTimeout
**类型:** `int`

**默认值:** `0`

连接超时时间，单位毫秒

### readBufferSize
**类型:** `int`

**默认值:** `1024`

读缓冲区大小，单位：字节。合理的大小可以减少系统调用次数，提高性能。

### writeBufferSize
**类型:** `int`

**默认值:** `1024`

写缓冲区大小，单位：字节。合理的大小可以减少系统调用次数，提高性能。

### debug
**类型:** `boolean`

**默认值:** `false`

是否开启调试模式。启用后会在控制台打印请求和响应的详细信息。

### proxy
**类型:** `ProxyOptions`

**默认值:** `null`

代理配置。

## HTTP请求
HttpClient 提供了 rest() 方法用于发送通用的 HTTP 请求。rest() 方法的参数包括：
- method: HTTP 请求方法，如 GET、POST、PUT、DELETE 等。
- path: 请求路径，如 /api/user。

请求构造完毕后，需要调用 submit() 方法发送请求。

```java title=HttpRestDemo.java "rest" "HttpMethod.GET" "submit"
public class HttpRestDemo {
    public static void main(String[] args) throws IOException {
        // 创建 HttpClient 实例
        HttpClient client = new HttpClient("https://smartboot.tech");
        client.options().debug(true);
        // 发送 GET 请求
        client.rest(HttpMethod.GET, "/feat/").onSuccess(response -> {
            System.out.println("Status Code: " + response.statusCode());
            System.out.println("Body: " + response.body());
        }).submit();
    }
}
```

对于 GET、POST 等常见的 HTTP 请求方法，HttpClient 提供了对应的方法，如 get()、post() 等，例如：
```java title=HttpGetDemo.java "get" "submit"
public class HttpGetDemo {
    public static void main(String[] args) {
        HttpClient httpClient = new HttpClient("https://smartboot.tech");
        httpClient.get("/feat/")
                .onSuccess(response -> System.out.println(response.body()))
                .onFailure(Throwable::printStackTrace)
                .submit();
    }
}
```

## 异步回调
HttpClient 提供了异步回调机制，可以在请求发送后立即返回，而不需要等待请求完成。

### onResponseHeader
当响应 Header 解析完成后，会触发 onResponseHeader 回调。
```java title=ResponseHeaderDemo.java "onResponseHeader"
public class ResponseHeaderDemo {
    public static void main(String[] args) {
        HttpClient httpClient = new HttpClient("https://smartboot.tech");
        httpClient.get("/feat/")
                .onResponseHeader(response -> {
                    for (String name : response.getHeaderNames()) {
                        System.out.println(name + ": " + response.getHeader(name));
                    }
                })
                .submit();
    }
}
```

### onResponseBody
对于存在响应体的请求，当`onResponseHeader`回调结束并开始接收到Body内容时，会触发 onResponseBody 回调。
```java title=ResponseBodyDemo.java "onResponseBody"
public class ResponseBodyDemo {
    public static void main(String[] args) {
        HttpClient httpClient = new HttpClient("https://smartboot.tech");
        httpClient.get("/feat/")
                .onResponseBody(new Stream() {
                    @Override
                    public void stream(HttpResponse response, byte[] bytes, boolean end) throws IOException {
                        System.out.println("接收到数据：" + new String(bytes));
                        if (end) {
                            System.out.println("数据接收完毕");
                        }
                    }
                })
                .submit();
    }
}
```
onResponseBody 的参数是一个 Stream 对象，用于消费响应体的内容：
- response: HttpResponse 对象，表示当前的响应。
- bytes: 字节数组，表示接收到的响应体内容。
- end: boolean 值，表示是否接收到了响应体的最后一部分内容。
### onSuccess
当请求成功时，会触发 onSuccess 回调。该回调发生于 onResponseBody 正常结束之后。
### onFailure
当请求失败时，会触发 onFailure 回调。